package com.aote.util;

import java.util.Arrays;

public class ArrayHelper {

	/**
	 * 两个数组，根据前n项进行关联，把后面数组的数据添加到前面数组中，如果在前面数组中没有找到关联 内容，在前面数组中添加一项，没有的内容设置成空。
	 * 例如{[1][b] ,[2][c]},{[1][d],[2][e]},合并后 {[1][b][d],[2][c][e]}
	 * 
	 * @param n
	 *            关联关键字个数
	 */
	public static String[][] uniteLastCols(String[][] datas,
			String[][] tempDatas, int n) {
		// 原数组列数扩充，加上新数组列数－关键字部分
		int size = tempDatas[0].length - n;
		int srcSize = datas[0].length;
		String[][] result = new String[datas.length][srcSize + size];
		// 复制原数组数据
		for (int i = 0; i < datas.length; i++) {
			for (int j = 0; j < datas[0].length; j++) {
				result[i][j] = datas[i][j];
			}
		}
		// 合并tempdatas的数据列
		for (int i = 0; i < tempDatas.length; i++) {
			// 根据关键字，找到要合并的数据所在行,没有关键字,一列列添加
			int row = i;
			if (n != 0) {
				row = indexOf(result, tempDatas[i], n);
				// 没有找到，添加一行
				if (row == -1) {
					result = extend(result, tempDatas[i], n);
					row = result.length - 1;
				}
			}
			// 复制数据部分
			System.arraycopy(tempDatas[i], n, result[row], srcSize, size);
		}
		return result;
	}

	/**
	 * 根据关键字，找到要合并的数据所在行
	 * 
	 * @param n
	 *            前n个是关键字
	 */
	private static int indexOf(String[][] datas, String[] value, int n) {
		// 对于每一个数据
		for (int i = 0; i < datas.length; i++) {
			// 如果相等，返回相等
			if (equals(datas[i], value, n)) {
				return i;
			}
		}
		return -1;
	}

	/**
	 * 根据前n项关键字，看两个数据是否相同
	 */
	private static boolean equals(String[] data, String[] value, int n) {
		// 对于每一个关键字
		for (int i = 0; i < n; i++) {
			// 如果不等，返回不等
			if (!data[i].equals(value[i])) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 给二维数组扩充新行，新行的前n项为新的关键字
	 */
	private static String[][] extend(String[][] datas, String[] value, int n) {
		int row = datas.length;
		int col = datas[0].length;
		String[][] result = new String[row + 1][col];
		// 复制前面的数据
		System.arraycopy(datas, 0, result, 0, row);
		// 设置最后一行为空串
		Arrays.fill(result[row], "");
		// 复制最后一行的前n项为新关键字
		System.arraycopy(value, 0, result[row], 0, n);
		return result;
	}
}
